package com.excilys.formation.projet.ebanking.dao.impl;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.excilys.formation.projet.ebanking.dao.api.IUtilisateurDao;
import com.excilys.formation.projet.ebanking.modele.Utilisateur;

public class UtilisateurDaoImpl extends HibernateDaoSupport implements IUtilisateurDao {
	
	@Override
	public int save(Utilisateur utilisateur) {
		return (Integer) getHibernateTemplate().save(utilisateur);
	}
	
	@Override
	public void delete(Utilisateur utilisateur) {
		getHibernateTemplate().delete(utilisateur);
	}
	
	@Override
	public void update(Utilisateur utilisateur) {
		getHibernateTemplate().update(utilisateur);
	}
	
	@Override
	public Utilisateur getUtilisateur(int id) {
		return getHibernateTemplate().get(Utilisateur.class, id);
	}
	
	@Override
	public Utilisateur getUtilisateurFetchComptes(int id) {
		Criteria criteria = getSession().createCriteria(Utilisateur.class);
		return (Utilisateur) criteria.add(Restrictions.eq("id", id)).setFetchMode("comptes", FetchMode.JOIN).uniqueResult();
	}
	
	@Override
	public List<Utilisateur> getUtilisateurs() {
		return getHibernateTemplate().loadAll(Utilisateur.class);
	}
	
	@Override
	public Utilisateur getUtilisateurByLogin(String login) {
		Criteria criteria = getSession().createCriteria(Utilisateur.class);
		return (Utilisateur) criteria.add(Restrictions.eq("login", login)).uniqueResult();
	}
	
	@Override
	public Utilisateur getUtilisateurByLoginFetchComptes(String login) {
		Criteria criteria = getSession().createCriteria(Utilisateur.class);
		return (Utilisateur) criteria.add(Restrictions.eq("login", login)).setFetchMode("comptes", FetchMode.JOIN).uniqueResult();
	}
	
	@Override
	public Utilisateur getUtilisateurByLoginFetchRoles(String login) {
		Criteria criteria = getSession().createCriteria(Utilisateur.class);
		return (Utilisateur) criteria.add(Restrictions.eq("login", login)).setFetchMode("roles", FetchMode.JOIN).uniqueResult();
	}
	
}
